sciencewikiaorg_ru-20200216-history
Модуль:Statistical/Region
local p = { }; local regions = { 0= "RU", --Российская федерация 1= "RU-ADY", --Адыгея 4= "RU-ALI", --Алтай 2= "RU-BAS", --Башкортостан 3= "RU-BUR", --Бурятия 5= "RU-DAG", --Дагестан 6= "RU-ING", --Ингушетия 7= "RU-KAB", --Кабардино-Балкария 8= "RU-KAI", --Калмыкия 9= "RU-KAO", --Карачаево-Черкесия 10= "RU-KAR", --Карелия 11= "RU-KOM", --Коми 91= "RU-KRM", --Крым 12= "RU-MAR", --Марий Эл 13= "RU-MOR", --Мордовия 14= "RU-SAH", --Саха (Якутия) 15= "RU-NOR", --Северная Осетия — Алания 16= "RU-TAT", --Татарстан 17= "RU-TUV", --Тыва (Тува) 18= "RU-UDM", --Удмуртия 19= "RU-KHK", --Хакасия 20= "RU-CHA", --Чечня 21= "RU-CHV", --Чувашия 22= "RU-ALT", --Алтайский край 75= "RU-ZAB", --Забайкальский край 41= "RU-KAM", --Камчатский край 23= "RU-KRA", --Краснодарский край 24= "RU-KYA", --Красноярский край 59= "RU-PER", --Пермский край 25= "RU-PRI", --Приморский край 26= "RU-STA", --Ставропольский край 27= "RU-KHA", --Хабаровский край 28= "RU-AMU", --Амурская область 29= "RU-ARK", --Архангельская область 30= "RU-AST", --Астраханская область 31= "RU-BEL", --Белгородская область 32= "RU-BRY", --Брянская область 33= "RU-VLA", --Владимирская область 34= "RU-VGG", --Волгоградская область 35= "RU-VLG", --Вологодская область 36= "RU-VOR", --Воронежская область 37= "RU-IVA", --Ивановская область 38= "RU-IRK", --Иркутская область 39= "RU-KAG", --Калининградская область 40= "RU-KAL", --Калужская область 42= "RU-KEM", --Кемеровская область 43= "RU-KIR", --Кировская область 44= "RU-KOS", --Костромская область 45= "RU-KUG", --Курганская область 46= "RU-KUR", --Курская область 47= "RU-LEN", --Ленинградская область 48= "RU-LIP", --Липецкая область 49= "RU-MAG", --Магаданская область 50= "RU-MOS", --Московская область 51= "RU-MUR", --Мурманская область 52= "RU-NIZ", --Нижегородская область 53= "RU-NGR", --Новгородская область 54= "RU-NVS", --Новосибирская область 55= "RU-OMS", --Омская область 56= "RU-ORE", --Оренбургская область 57= "RU-ORL", --Орловская область 58= "RU-PNZ", --Пензенская область 60= "RU-PSK", --Псковская область 61= "RU-ROS", --Ростовская область 62= "RU-RYA", --Рязанская область 63= "RU-SAM", --Самарская область 64= "RU-SAR", --Саратовская область 65= "RU-SAK", --Сахалинская область 66= "RU-SVE", --Свердловская область 67= "RU-SMO", --Смоленская область 68= "RU-TAM", --Тамбовская область 69= "RU-TVE", --Тверская область 70= "RU-TOM", --Томская область 71= "RU-TUL", --Тульская область 72= "RU-TYU", --Тюменская область 73= "RU-ULY", --Ульяновская область 74= "RU-CHE", --Челябинская область 76= "RU-YAR", --Ярославская область 77= "RU-MOW", --Москва 78= "RU-SPB", --Санкт-Петербург 92= "RU-SEV", --Севастополь 79= "RU-JEW", --Еврейская АО --83= "RU-XXX", --Ненецкий АО --86= "RU-XXX", --Ханты-Мансийский АО — Югра 87= "RU-CHU", --Чукотский АО --89= "RU-XXX", --Ямало-Ненецкий АО }; local byte = string.byte local char = string.char local concat = table.concat local gmatch = string.gmatch -- Forward references -- local tab = { -- tabij = xor(i-1, j-1) {0, 1, 2, 3, 4, 5, 6, 7, }, {1, 0, 3, 2, 5, 4, 7, 6, }, {2, 3, 0, 1, 6, 7, 4, 5, }, {3, 2, 1, 0, 7, 6, 5, 4, }, {4, 5, 6, 7, 0, 1, 2, 3, }, {5, 4, 7, 6, 1, 0, 3, 2, }, {6, 7, 4, 5, 2, 3, 0, 1, }, {7, 6, 5, 4, 3, 2, 1, 0, }, } local function bxor (a,b) local res, c = 0, 1 while a > 0 and b > 0 do local a2, b2 = a%8, b%8; res = res + taba2+1b2+1*c a,b,c = (a-a2)/8 , (b-b2)/8, c*8 end res = res + a*c + b*c return res end --local function band (a,b) return ((a+b) - bxor(a,b))/2 end -- другая реализация band(hash * 16777619, 2^32 - 1) local function hack(hash) local mas={ 0x80000000, 0xC0000000, 0x60000000, 0x30000000, 0x98000000, 0x4C000000, 0x26000000, 0x93000000, 0xC9800000, 0x64C00000, 0x32600000, 0x19300000, 0xC980000, 0x64C0000, 0x3260000, 0x1930000, 0xC98000, 0x64C000, 0x326000, 0x193000, 0xC9800, 0x64C00, 0x32600, 0x19300, 0x8000C980, 0x400064C0, 0x20003260, 0x10001930, 0x8000C98, 0x400064C, 0x2000326, 0x1000193, }; local result ,i, step = 0, 1, 0x80000000; while (hash>0) do if hash >= step then result = result + masi; hash = hash - step; end i , step = i+1 , step/2; end while (result>=0x100000000) do result = result - 0x100000000; end return result end function p.FNV32_1A (str) local hash = 2166136261 for char in gmatch(str,".") do hash = bxor(hash, byte(char)) hash = hack(hash) --hash = band(hash * 16777619, 2^32 - 1) end return hash end local i=0; --Считаем хэш, если страница есть в науке, то это её ID, а если нет, то это злобная функция на xor-ах function p.hash(str) local title = mw.title.new(str); if (title.id~=0) then str = title.id; else str = p.FNV32_1A(str); end return str; end --Считаем хэш пока можем, ID от имени страницы можно взять только 500 раз, потом ничего не делаем function numbyname(str) -- if true then -- return "test"; -- end -- str = str:gsub('@','%('); -- str = str:gsub('№','%)'); if(i<500) then i=i+1 str = p.hash(str) else str = '"'..str..'"'; -- востанавливаем кавычки end return "str .. ""; -- востанавливаем скобки end -- Функция заменяющая в первом параметре все вхождения имён модулей на их числовые значения function p.otherformat( frame ) if (not frame.args) or (not frame.args1) then error( 'Отсуствуют обязательный параметр на входе функции otherformat в модуле ' .. frame:getTitle() ) end local result = frame.args1; for key, val in pairs(regions) do local pattern = val:gsub("[%^%$%(%)%%%.%%%*%+%-%?]","%%%1" ) -- val преобразуем в pattern, заменяя нехорошие символы result = result:gsub( '("'..pattern..'")', tostring(key) ) -- заменяем val на key end -- result = result:gsub('%(','@'); -- result = result:gsub('%)','№'); result = result:gsub('%["(1234567890@№+)"%]',numbyname); return result; end local meta = {} local forparse={ '=mw.ustring.codepoint(' ',1), '{'=mw.ustring.codepoint('{',1), '}'=mw.ustring.codepoint('}',1), [''=mw.ustring.codepoint('['']=mw.ustring.codepoint(']',1), '\t'=mw.ustring.codepoint('\t',1), '\n'=mw.ustring.codepoint('\n',1), ','=mw.ustring.codepoint(',',1), '"'=mw.ustring.codepoint('"',1), '\''=mw.ustring.codepoint('\'',1), '0'=mw.ustring.codepoint('0',1), '1'=mw.ustring.codepoint('1',1), '2'=mw.ustring.codepoint('2',1), '3'=mw.ustring.codepoint('3',1), '4'=mw.ustring.codepoint('4',1), '5'=mw.ustring.codepoint('5',1), '6'=mw.ustring.codepoint('6',1), '7'=mw.ustring.codepoint('7',1), '8'=mw.ustring.codepoint('8',1), '9'=mw.ustring.codepoint('9',1), '-'=mw.ustring.codepoint('-',1), } function forparse.getstring(s,pos,ends) local first,result=pos,nil local parse={ [forparseends]=function() mw.log("getstring>",pos,"-next") result= mw.ustring.sub(s,first,pos-1) end, } while(result nil) do local f=parsemw.ustring.codepoint(s,pos) if(f nil) then pos=pos+1 else f() if(result nil) then mw.log("getstring>",pos,"-end string false") return nil,pos end end end mw.log("getstring>",pos,"-end string ",result) return result,pos+1 end function forparse.getnumber(s,pos) local first=pos local parse={ [forparse'0']=function() mw.log("getnumber>",pos,"-next") pos=pos+1 end, } for i = 1,9 do parse[forparsetostring(i)]=parse[forparse'0'] end local result=nil while(result nil) do local f=parsemw.ustring.codepoint(s,pos) if(f nil) then result= tonumber(mw.ustring.sub(s,first,pos-1)) else f(); end end mw.log("getnumber>",pos,"-end number ",result) return result,pos end function forparse.getcomment(s,pos) local p=mw.ustring.find(s,"\n",pos,true); return mw.ustring.sub(s,pos,p-1),p+1 end function forparse.getmas(s,pos) local result,current,mpos={},1,nil local next=function (r,pos) if(mpos) then if(resultmpos~=nil) then mw.log("getmas>",pos,"всё плохо") result,current=nil,nil else resultmpos=r end else if(resultcurrent~=nil) then mw.log("getmas>",pos,"всё плохо") result,current=nil,nil else resultcurrent=r end end return pos end local parse={ [forparse']=function() mw.log("getmas>",pos,"-пробел") pos=pos+1 end, [forparse'"']=function() mw.log("getmas>",pos,"-begin string") pos=next(forparse.getstring(s,pos+1,'"')) end, [forparse'\'']=function() mw.log("getmas>",pos,"-begin string") pos=next(forparse.getstring(s,pos+1,'\'')) end, [forparse'0']=function() mw.log("getmas>",pos,"-begin number") pos=next(forparse.getnumber(s,pos)) end, [forparse'{']=function() mw.log("getmas>",pos,"-begin mas") pos=next(forparse.getmas(s,pos+1)) end, [forparse['']=function() mw.log("getmas>",pos,"-begin mpos,pos=forparse.getvalue(s,pos+1) end, [forparse['']]=function() mw.log("getmas>",pos,"-begin if(mpos nil) then result,current=nil,nil end end, [forparse[',']=function() mw.log("getmas>",pos,"-next el") current, pos, mpos=current+1, pos+1, nil end, [forparse'}']=function() mw.log("getmas>",pos,"-end mas") current,pos=nil,pos+1 end, [forparse'-']=function() mw.log("getmas>",pos,"-begin коментарий") if(mw.ustring.codepoint(s,pos+1) forparse'-') then result"комментарий",pos=forparse.getcomment(s,pos+2) else result,current=nil,nil end end } parse[forparse'\t']=parse[forparse'] parse[forparse'\n']=parse[forparse'] for i = 1,9 do parse[forparsetostring(i)]=parse[forparse'0'] end while(current~=nil) do local f=parsemw.ustring.codepoint(s,pos) if(f nil) then mw.log("getvalue>unknown symbol",pos," '",mw.ustring.codepoint(s,pos),"'") return nil,pos end f(); end return result,pos end function forparse.getvalue(s,pos) local result=nil local parse={ [forparse']=function() mw.log("getvalue>",pos,"-пробел") pos=pos+1 end, [forparse'"']=function() mw.log("getvalue>",pos,"-begin string") result,pos=forparse.getstring(s,pos+1,'"') end, [forparse'\'']=function() mw.log("getvalue>",pos,"-begin string") result,pos=forparse.getstring(s,pos+1,'\'') end, [forparse'0']=function() mw.log("getvalue>",pos,"-begin number") result,pos=forparse.getnumber(s,pos) end, [forparse'{']=function() mw.log("getvalue>",pos,"-begin mas") result,pos=forparse.getmas(s,pos+1) end } parse[forparse'\t']=parse[forparse'] parse[forparse'\n']=parse[forparse'] for i = 1,9 do parse[forparsetostring(i)]=parse[forparse'0'] end while(result nil) do local f=parsemw.ustring.codepoint(s,pos) if(f nil) then mw.log("getvalue>unknown symbol",pos," '",mw.ustring.codepoint(s,pos),"'") return nil,pos end f(); end local ends=true parse={ [forparse']=parse[forparse'], [forparse',']=function() ends=false end } parse[forparse'}']=parse[forparse','] parse[forparse'']]=parse[forparse','] parse[forparse'\t']=parse[forparse'] parse[forparse'\n']=parse[forparse'] while(ends) do local f=parsemw.ustring.codepoint(s,pos) if(f nil) then mw.log("getvalue>unknown symbol",pos," '",mw.ustring.codepoint(s,pos),"'") return result,pos end f(); end return result,pos end function getkeyfromstring(s,key) local first = '%.. key .. '%s*%%s*=' mw.log(first) local pos = mw.ustring.find(s,first,1); mw.log(pos) if (pos nil) then return nil end pos = mw.ustring.find(s,"=",pos,true)+1; mw.log(pos); local result,pos2 result,pos2 =forparse.getvalue(s,pos) if(result~=nil) then mw.log("getvalue end") return result end mw.log("getvalue false") return nil end function meta.__index(op, key) --mw.log("meta.__index"); local result = rawget(op,key) -- проверяем не запрашивали ли таблицу ранее if(result nil) then local s=rawget(op,0) if(s nil) then return nil end result = getkeyfromstring(s,key) if(result~=nil) then rawset(op,key,result) end end return result end -- Функция по имени возвращает модуль function p.getModule( num ) local frame=mw.getCurrentFrame() local modul=frame.argsnum; if(type(modul) "string") then modul = { modul } setmetatable(modul, meta) frame.argsnum = modul end return modul; end function p.testkeyfromstring( frame ) if(frame.args1 nil or frame.args2 nil) then return nil end return mw.dumpObject(getkeyfromstring(frame.args1,frame.args2)) end return p